﻿using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;

namespace InDepth2Demo.Chapter16
{
    internal class OtherFeature
    {
        // 使用捕获的迭代变量
        public static void Call()
        {
            string[] values = { "x", "y", "z" };

            var actions = new List<Action>();

            foreach (var value in values)
            {
                actions.Add(() => Console.WriteLine(value));
            }

            foreach (Action value in actions)
            {
                value();
            }
        }


        // CallerFilePath、CallerLineNumber 和 CallerMemberName 是 C# 中的 调用者信息特性，它们的主要作用是让编译器在编译时自动填充方法的参数值，从而提供调用上下文的信息。
        // 这些特性在调试、日志记录、代码分析等场景中非常有用。

        // 使用调用者信息特性
        static void ShowInfo([CallerFilePath] string file = null, [CallerLineNumber] int line = 0, [CallerMemberName] string member = null)
        {
            Console.WriteLine($"{file} : {line} - {member}");
        }

        public static void Call2()
        {
            ShowInfo();     // 编译器填充所有参数
        }
        // 输出：
        // D:\Mproject\Net4Demo-master\InDepth2Demo\Chapter16\OtherFeature.cs : 38 - Call2
    }


    // 试图在特性声明时使用调用者信息特性
    [AttributeUsage(AttributeTargets.All)]
    public class MemberDescriptionAttribute : Attribute
    {
        public MemberDescriptionAttribute([CallerMemberName] string member = null)
        {
            Member = member;
        }
        public string Member { get; set; }
    }
}
